/**
 * 构造函数 用于取消相同请求的上一个请求
 */
class CancelControl {
  /* 构造函数 */
  constructor() {
    this.allCancelApi = {}
  }
  setAbortAPI(calcelAPI) {
    const abord = new AbortController();
    this.allCancelApi[calcelAPI] = abord
    return abord.signal
  }
  abort(calcelAPI) {
    if (this.allCancelApi[calcelAPI]) {
      this.allCancelApi[calcelAPI].abort()
    }
  }
}

import axios from "axios";
// 使用环境变量来设置基础URL
// process?.env?.VUE_APP_API_BASE_URL ||
const baseURL = "/api";
const cancelControl = new CancelControl()
const request = axios.create({
  baseURL: baseURL,
  timeout: 5000,
  // headers: {
  //   "Content-type": "application/json;charset=utf-8"
  // }
});

request.interceptors.request.use(config => {
  // 将url参数带入 避免不同 url 参数也会取消
  let tempSignal = `${config['baseURL']}${config['url']}`;
  if (config['params'] && Object.keys(config['params']).length > 0) {
    Object.keys(config['params']).filter((val, ind) => {
      tempSignal += `${ind == 0 ? '?' : '&'}${val}=${config['params'][val]}`
    })
  }
  // 取消前一个接口
  cancelControl.abort(tempSignal)
  const token = localStorage.getItem("token");
  if (token) {
    config.headers['Authorization'] = 'Bearer ' + token;
  }
  config['signal'] = cancelControl.setAbortAPI(tempSignal)

  return config;
}, error => {
  console.error("Request error: ", error);
  return Promise.reject(error);
});

request.interceptors.response.use(response => {
  if (response.status === 200) {
    return response.data;
  } else {
    // 可以根据需要添加更多的错误处理
    // console.error("Response error: ", response);
    return Promise.reject(new Error("Error with status code " + response.status));
  }
}, error => {
  // 对常见的HTTP错误进行处理
  if (error.response) {
    // 请求已发出，服务器回复状态码不在2xx范围
    // console.error("Error status: ", error.response.status);
    // 根据返回的状态码进行不同的处理
    // 例如: if (error.response.status === 401) { // 处理登录过期 }
  } else if (error.code == "ERR_CANCELED") {
    // console.log('请求取消');
  } else {
    // 服务器连回应都没有返回
    console.error("Network error: ", error);
  }
  return Promise.reject(error);
});
export default request;